home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / dbinterf.c < prev    next >
Text File  |  1996-05-27  |  13KB  |  606 lines

  1. /*
  2.  * DbInterface.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Interface entre serveur et gestion de bases de donn‚es DXF
  7.  *
  8.  * History:
  9.  * --------
  10.  * 08.12.94: fplanque: Created
  11.  */
  12.  
  13.    #include "!OPTIONS.H"                /* Options de compilation */         
  14.     #define    THIS_FILE    "DBINTERF.C v1.00 - 03.95"
  15.  
  16. /*
  17.  * System headers:
  18.  */
  19.     #include <stdio.h>
  20.     #include <string.h>
  21.        
  22.  
  23. /*
  24.  * Custom headers:
  25.  */
  26.     #include    "SPEC_PU.H"
  27.     #include "S_MALLOC.H"
  28.     #include    "DEBUG_PU.H"    
  29.     #include "DATPG_PU.H"
  30.     #include "DBSYS_PU.H"
  31.     #include "SERV_PU.H"
  32.     #include "LISTS_PU.H"
  33.     #include "FILES_PU.H"
  34.     #include "TEXT_PU.H"
  35.     #include "DBINT_PU.H"
  36.     #include    "LINE0_PU.H"
  37.  
  38.  
  39. /*
  40.  * ------------------------ FUNCTIONS -------------------------
  41.  */
  42.  
  43. /*
  44.  * LectMsg_EraseCurrRec(-)
  45.  *
  46.  * Purpose:
  47.  * --------
  48.  * Contr“le si on peu effacer puis
  49.  * Efface le record demand‚ de la base demand‚e
  50.  *
  51.  * History:
  52.  * --------
  53.  * 17.05.94: Demande Xlock avant d'effacer, si non accord‚, n'efface pas.
  54.  * 13.01.95: met statut maj de la DB … MODIFIED
  55.  * 15.03.95: extracted from LectMsg_EraseCurrRec(-)
  56.  */
  57. BOOL    CompRec_Erase(                                        /* Out: TRUE if success */
  58.             VOIE                 *    pVoie_curr,                /* In:  Voie concern‚e */
  59.             COMPACT_RECORD *    pCompRec_toKill,    /* In:  Ptr sur le Record … supprimer */
  60.             DATAPAGE            *    pDataPage_DB )            /* In:  Base de donn‚es concern‚e */
  61. {
  62.     DATA_RECORDS    *    pDataRecs_dbase = pDataPage_DB -> data.records;
  63.     COMPACT_RECORD *    pCompRec_prev;
  64.     COMPACT_RECORD *    pCompRec_next;
  65.  
  66.     /*
  67.      * V‚rification de l'int‚grit‚ du champ:
  68.      */
  69.     MCHECK( pCompRec_toKill );
  70.  
  71.     /*
  72.      * Demande la Transformation du ReadLock sur ce message
  73.      * en XLock (exclusif). Ce ne sera possible que si le message n'est
  74.      * pas d‚j… utilis‚.
  75.       */
  76.     if( DBInt_changeReadToXLock( pVoie_curr, pCompRec_toKill ) == FAILURE_1 )
  77.     {    /* 
  78.          * Si l'effacement de ce record pose un conflit d'accŠs:
  79.          */
  80.         aff_msg_l0( pVoie_curr, "Ce message est utilis‚ par un tiers!" );
  81.         return FALSE0;    
  82.     }
  83.  
  84.  
  85.     aff_msg_l0( pVoie_curr, "Effacement en cours..." );
  86.  
  87.     /*
  88.      * Effacement de la liste: 
  89.      */
  90.     pCompRec_prev = pCompRec_toKill -> prev;            /* Msg pr‚c‚dent */
  91.     pCompRec_next = pCompRec_toKill -> next;            /* Msg suivant */
  92.     
  93.     /*
  94.      * Etabli lien prev -> next
  95.      */
  96.     if( pCompRec_prev != NULL )
  97.     {    /*
  98.          * Pas d‚but de liste: 
  99.          */
  100.         pCompRec_prev -> next = pCompRec_next;
  101.     }
  102.     else
  103.     {
  104.         pDataRecs_dbase -> first_record = pCompRec_next;
  105.     }
  106.  
  107.     /*
  108.      * Etabli lien prev <- next
  109.      */
  110.     if( pCompRec_next != NULL )
  111.     {    /* 
  112.          * Pas fin de liste: 
  113.          */
  114.         pCompRec_next -> prev = pCompRec_prev;
  115.     }
  116.     else
  117.     {
  118.         pDataRecs_dbase -> last_record = pCompRec_prev;
  119.     }
  120.  
  121.     /*
  122.      * 1 message de moins: 
  123.      */
  124.     pDataRecs_dbase -> nb_records --;
  125.     
  126.     /*
  127.      * EnlŠve XLock: pour ne pas se planter lors de actions_AtPageExit()
  128.      */
  129.     DBInt_releaseXLock( pVoie_curr, pCompRec_toKill );
  130.  
  131.     FREE( pCompRec_toKill );
  132.     pCompRec_toKill = NULL;    /* S‚curit‚ */
  133.  
  134.     /*
  135.      * Signale que la DataPage a ‚t‚ modifi‚e:
  136.      */
  137.     dataPage_chgSavState( pDataPage_DB, SSTATE_MODIFIED, TRUE_1, TRUE_1 );
  138.  
  139.     aff_msg_l0( pVoie_curr, "OK." );
  140.  
  141.     return    TRUE_1;
  142. }
  143.  
  144.  
  145. /*
  146.  * CompRec_GetRecFlags(-)
  147.  *
  148.  * Retourne les flags d'un record
  149.  *
  150.  * 10.01.95: fplanque: Created
  151.  */
  152. RECORD_FLAGS CompRec_GetRecFlags(                        /* Out: Flags du record, tout est … z‚ro si yen a pas */
  153.                     COMPACT_RECORD    *    PCompactRecord )    /* In: Record dont on veut connaitre les flags */
  154. {
  155.     HEAD_STRING *    pHeadString = &(PCompactRecord -> data.header .header);
  156.     
  157.     if( pHeadString -> rec_length > sizeof( ULONG ) + 2 * sizeof( RECORD_NUMBER ) )
  158.     {    /*
  159.          * Il y a un champ record Flags:
  160.          */
  161.         return    pHeadString -> RecFlags;    
  162.     }
  163.     else
  164.     {
  165.         RECORD_FLAGS    RecFlags_Empty = { 0, 0 };
  166.         return    RecFlags_Empty;
  167.     }
  168. }
  169.  
  170.  
  171. /*
  172.  * Create_TextRecFld(-)
  173.  *
  174.  * Purpose:
  175.  * --------
  176.  * Cr‚ation d'un texte dans un champ texte
  177.  *
  178.  * History:
  179.  * --------
  180.  * 1993: fplanque: Created
  181.  * 27.11.94: changed a lot from fill_textfield()
  182.  * 01.12.94: prend id champ en paramŠtre
  183.  * 08.12.94: diff‚rents modes de compactage
  184.  */
  185. RECORD_FIELD    *    Create_TextRecFld(     /* Out: Champ de DB cr‚‚ */
  186.         const    ULONG            cUL_FieldId,    /* In:  Identificateur du champ */
  187.         const IOFIELD    *    cpInField )        /* In:  Champ de saisie dont on doit ins‚rer le contenu */
  188. {
  189.     size_t        field_length;
  190.     char        *    field_string;
  191.     TEXTLINE    *    pTextLine_First;
  192.     int            n_CompactingMode;
  193.     
  194.     /*
  195.      * Cr‚e champ:
  196.      */
  197.     RECORD_FIELD    *    pRecField = MALLOC( sizeof( RECORD_FIELD ) );
  198.  
  199.     /*
  200.      * Pas de champ suivant pour l'instant:
  201.      */
  202.     pRecField -> next = NULL;
  203.  
  204.     /*
  205.      * ID du champ 
  206.      */
  207.     pRecField -> field_id = cUL_FieldId;
  208.  
  209.     /*
  210.      * Texte … compacter:
  211.      */
  212.     pTextLine_First = cpInField -> pTextInfo -> firstline -> next;
  213.  
  214.     /*
  215.      * Mode de compactage:
  216.      */
  217.     if( cpInField -> FPar.Input -> InFieldFlags .b_MultiParagraph )
  218.     {    /*
  219.          * Si on accŠpte plusieurs paragraphes:
  220.          */
  221.         n_CompactingMode = FMTMODE_REZO;
  222.     }
  223.     else
  224.     {
  225.         n_CompactingMode = FMTMODE_SGLETEXTLINE;
  226.     }
  227.  
  228.  
  229.     /*
  230.      * Compacte le texte: 
  231.      */
  232.     field_length = compact_text( pTextLine_First, n_CompactingMode, &field_string );
  233.  
  234.     /*
  235.      * Assure une longueur paire:
  236.      * Normalement compact_text() s'en est d‚j… oqp grƒce au param FMTMODE_REZO
  237.      * mais on se la joue prudence ici.. on sait jamais ski peut arriver par suite demodifs ult‚rieures
  238.      */
  239.     field_length = (field_length+1) & PARITY;
  240.  
  241.     /*
  242.      * Fixe donn‚es dans le champ texte: 
  243.      */
  244.     pRecField -> length         = field_length;    /* Longueur chaine */
  245.     pRecField -> info.string = field_string;    /* Sauve adresse */
  246.     
  247.     return    pRecField;
  248. }
  249.  
  250.  
  251.  
  252. /*
  253.  * DBInt_AppendCompRecToDB(-)
  254.  *
  255.  * Purpose:
  256.  * --------
  257.  * Ajoute un COMPACT RECORD … une base de donn‚es
  258.  * lorsqu'un connect‚ a entr‚ une information:
  259.  *
  260.  * History:
  261.  * --------
  262.  * 16.12.94: fplanque: Created
  263.  * 13.02.95: Sauvegarde sur disque
  264.  */
  265. void    DBInt_AppendCompRecToDB(
  266.             VOIE                 *    pVoie_curr,        /* In:  Voie concern‚e */
  267.             COMPACT_RECORD *    pCompactRec,    /* In: Ptr sur le Record … ajouter */
  268.             DATAPAGE            *    pDataPage_DB )    /* In: Base de donn‚es concern‚e */
  269. {
  270.     SSTATE SState = dataPage_getSavState( pDataPage_DB );
  271.     
  272.     /*
  273.      * V‚rification de l'int‚grit‚ du champ:
  274.      */
  275.     MCHECK( pCompactRec );
  276.  
  277.     /*
  278.      * Ajoute record ds DB:
  279.      */
  280.     Append_CompactRecToDB( pCompactRec, pDataPage_DB -> data.records );
  281.  
  282.     if( SState == SSTATE_SAVED )
  283.     {    /*
  284.          * Si la base de donn‚es n'‚tait pas d‚j… modifi‚e,
  285.          * On va sauver le nouveau record en fin de fichier!
  286.          * Comme ‡a on peut laisser la base en statut SAVED
  287.          * Ce qui est plus sur en cas de plantage ult‚rieur! (cool!)
  288.          */
  289.  
  290.         if( set_DtPgFilePath( pDataPage_DB ) == TRUE_1 )
  291.         {
  292.             sprintf( G_tmp_buffer, "   Sauvegarde dans %s\\%s", G_filepath, G_filename );
  293.             add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  294.  
  295.             if( Append_CompRecToDXFFile( pCompactRec ) == TRUE_1 )
  296.             {    
  297.                 return;
  298.             }
  299.             else
  300.             {
  301.                 TRACE0("Append Failed");
  302.             }
  303.         }
  304.         else
  305.         {
  306.             TRACE0("set_DtPgFilePath() Failed");
  307.         }
  308.  
  309.         /*
  310.          * Echec: on a pas pu sauver:
  311.          * Signale que la DataPage a ‚t‚ modifi‚e
  312.          * pour sauvegarde ult‚rieure:
  313.          */
  314.          dataPage_chgSavState( pDataPage_DB, SSTATE_MODIFIED, TRUE_1, TRUE_1 );
  315.     }
  316. }
  317.  
  318.  
  319. /*
  320.  * ----------------------- Record locks -----------------------------
  321.  */
  322.  
  323.  
  324. /*
  325.  * DBInt_AddLockToList(-)
  326.  *
  327.  * Purpose:
  328.  * --------
  329.  * Cr‚ee un  m‚mo sur un ReadLock
  330.  * et l'ajoute … la liste des m‚mos
  331.  *
  332.  * History:
  333.  * --------
  334.  * 30.01.95: fplanque: created
  335.  */
  336. void    DBInt_AddLockToList(
  337.             VOIE *                pVoie_curr,    /* In:  Voie concern‚e */
  338.             COMPACT_RECORD *    pCompRec )     /* In:  Ptr sur record … d‚locker */
  339. {
  340.     COMPREC_LISTELT * pCRListElt = MALLOC( sizeof( COMPREC_LISTELT ) );
  341.  
  342.     pCRListElt -> pCompRec = pCompRec;
  343.  
  344.     pVoie_curr -> pCRLstElt_1stRLock = Insert_InSingleLinkList( pVoie_curr -> pCRLstElt_1stRLock, pCRListElt );
  345. }
  346.  
  347.  
  348. /*
  349.  * DBInt_requestReadLock(-)
  350.  *
  351.  * Purpose:
  352.  * --------
  353.  * Demande et positionne un Lock de lecture sur un enregistrement
  354.  * Lorsqu'une voie a demand‚ un ReadLock, elle peut librement
  355.  * lire le record, elle n'a, par contre, pas le droit de le modifier.
  356.  *
  357.  * Algorythm:
  358.  * ----------
  359.  * Appelle request_ReadLock()
  360.  * M‚morise ce lock dans la voie
  361.  *
  362.  * Notes:
  363.  * ------
  364.  * Plusieurs voies/fonctions peuvent detenir simultan‚ment un ReadLock
  365.  * sur le mˆme record
  366.  * Lib‚rer avec DBInt_releaseReadLock()
  367.  *
  368.  * History:
  369.  * --------
  370.  * 25.01.95: fplanque: Created
  371.  */
  372. COMPACT_RECORD *    DBInt_requestReadLock(         /* Out: NULL si imposs, sinon ptr sur locked rec */
  373.                 VOIE *                pVoie_curr,    /* In: Voie concern‚e */
  374.                 COMPACT_RECORD *    pCompRec )     /* In:  Ptr sur record … locker */
  375. {
  376.     if( request_ReadLock( pCompRec ) != SUCCESS0 )
  377.     {
  378.         return    NULL;
  379.     }
  380.  
  381.     /*
  382.      * M‚morise le lock!
  383.      */
  384.     DBInt_AddLockToList( pVoie_curr, pCompRec );
  385.  
  386.     return    pCompRec;
  387.  
  388.  
  389. /*
  390.  * DBInt_RemoveLockFromList(-)
  391.  *
  392.  * Purpose:
  393.  * --------
  394.  * EnlŠve le m‚mo sur un ReadLock de la liste des m‚mos
  395.  *
  396.  * History:
  397.  * --------
  398.  * 25.01.95: fplanque: created
  399.  * 30.01.95: corrig‚ bug prevnext
  400.  */
  401. void    DBInt_RemoveLockFromList(
  402.             VOIE *                pVoie_curr,    /* In:  Voie concern‚e */
  403.             COMPACT_RECORD *    pCompRec )     /* In:  Ptr sur record … d‚locker */
  404. {
  405.     COMPREC_LISTELT ** ppCRListElt_PrevNext = &(pVoie_curr -> pCRLstElt_1stRLock);
  406.     COMPREC_LISTELT * pCRListElt_List;
  407.  
  408.     for(  pCRListElt_List = pVoie_curr -> pCRLstElt_1stRLock;
  409.              pCRListElt_List != NULL;
  410.               pCRListElt_List = pCRListElt_List -> pCRListElt_next )
  411.              
  412.     {
  413.         if( pCRListElt_List -> pCompRec == pCompRec )
  414.         {
  415.             *ppCRListElt_PrevNext = pCRListElt_List -> pCRListElt_next;
  416.             
  417.             FREE( pCRListElt_List );
  418.             
  419.             return;
  420.         }
  421.  
  422.         ppCRListElt_PrevNext = &( pCRListElt_List -> pCRListElt_next );
  423.     }
  424.  
  425.     signale( "Voie … lib‚r‚ un Lock qu'elle n'avait pas r‚serv‚!" );
  426. }
  427.  
  428.  
  429. /*
  430.  * DBInt_releaseReadLock(-)
  431.  *
  432.  * Purpose:
  433.  * --------
  434.  * LibŠre le read lock qu'une vois/fonction avait sur un record
  435.  *
  436.  * Algorythm:
  437.  * ----------  
  438.  * appelle release_ReadLock
  439.  * enlŠve de la liste des readlocks de la voie
  440.  *
  441.  * Notes:
  442.  * ------
  443.  * Plusieurs voies/fonctions peuvent detenir simultan‚ment un ReadLock
  444.  * sur le mˆme record
  445.  *
  446.  * History:
  447.  * --------
  448.  * 25.01.95: fplanque: Created 
  449.  * 15.03.95: esc on NULL
  450.  */
  451. void    DBInt_releaseReadLock(
  452.             VOIE *                pVoie_curr,    /* In: Voie concern‚e */
  453.             COMPACT_RECORD *    pCompRec )     /* In:  Ptr sur record … d‚locker */
  454. {
  455.     if( pCompRec == NULL )
  456.     {
  457.         return;
  458.     }
  459.  
  460.     /* TRACE0( "Releasing 1 readlock!" ); */
  461.  
  462.     /*
  463.      * lib‚ration effective du readlock:
  464.      */
  465.     release_ReadLock( pCompRec );
  466.  
  467.     /*
  468.      * Supprime m‚mo readlock:
  469.      */
  470.     DBInt_RemoveLockFromList( pVoie_curr, pCompRec );
  471. }
  472.  
  473.  
  474.  
  475.  
  476.  
  477. /*
  478.  * DBInt_changeReadToXLock(-)
  479.  *
  480.  * Purpose:
  481.  * --------
  482.  * Essaie de modifier un ReadLock sur un record en XLock
  483.  *
  484.  * Algorythm:
  485.  * ----------  
  486.  * appelle change_ReadToXLock()
  487.  * si le changement est accept‚,
  488.  *    change le m‚mo interne de la voie de Read vers X
  489.  *
  490.  * Notes:
  491.  * ------
  492.  * Si quelqu'un d'autre detient egalement un Readlock sur le record
  493.  * en question, le XLock ne peut pas ˆtre attribu‚.
  494.  *
  495.  * History:
  496.  * --------
  497.  * 25.01.95: fplanque: Created
  498.  */
  499. int    DBInt_changeReadToXLock(             /* Out: !=0 si impossible */
  500.             VOIE *                pVoie_curr,    /* In: Voie concern‚e */
  501.             COMPACT_RECORD *    pCompRec )     /* In:  Ptr sur record … locker */
  502. {
  503.     int    n_Result;
  504.  
  505.     /*
  506.      * SECURITE:
  507.      * V‚rifie qu'il n'y a pas d‚j… un XLock de fait par cette voie:
  508.      */
  509.     if( pVoie_curr -> pCompRec_XLock != NULL )
  510.     {
  511.         signale( "Impossible d'attribuer plus d'un XLock … une voie!" );
  512.         return    FAILURE_1;
  513.     }
  514.  
  515.  
  516.     /*
  517.      * Tente de changer le lock:
  518.      */
  519.     n_Result = change_ReadToXLock( pCompRec );
  520.     if( n_Result != SUCCESS0 )
  521.     {    /*
  522.          * Echec:
  523.          */
  524.         return    n_Result;
  525.     }
  526.  
  527.     /*
  528.      * M‚morise le XLock:
  529.      */
  530.     pVoie_curr -> pCompRec_XLock = pCompRec;
  531.  
  532.     /*
  533.      * retire le m‚mo indiquant un ReadLock sur ce champ:
  534.      */
  535.     DBInt_RemoveLockFromList( pVoie_curr, pCompRec );
  536.  
  537.     return    SUCCESS0;
  538.  
  539.  
  540. /*
  541.  * DBInt_releaseXLock(-)
  542.  *
  543.  * Purpose:
  544.  * --------
  545.  * LibŠre le lock exclusif qu'on avait sur un record
  546.  *
  547.  * Algorythm:
  548.  * ----------  
  549.  * appelle release_XLock()
  550.  * supprime m‚mo
  551.  *
  552.  * History:
  553.  * --------
  554.  * 25.01.95: fplanque: Created
  555.  */
  556. void    DBInt_releaseXLock(
  557.             VOIE *                pVoie_curr,    /* In: Voie concern‚e */
  558.             COMPACT_RECORD *    pCompRec )     /* In: Ptr sur record … d‚locker */
  559. {
  560.     release_XLock( pCompRec );
  561.  
  562.     if( pVoie_curr -> pCompRec_XLock != pCompRec )
  563.     {
  564.         signale( "Voie a lib‚r‚ un XLock qu'elle n'avait pas r‚serv‚" );
  565.         return;
  566.     }
  567.     
  568.     pVoie_curr -> pCompRec_XLock = NULL;
  569. }
  570.  
  571.  
  572.  
  573. /*
  574.  * DBInt_ReleaseAllLocks(-)
  575.  *
  576.  * Purpose:
  577.  * --------
  578.  * EnlŠve tous les locks (lecture et ecriture)
  579.  * sur records que la voie s'est attribu‚
  580.  *
  581.  * History:
  582.  * --------
  583.  * 26.01.95: fplanque: Created
  584.  */
  585. void    DBInt_ReleaseAllLocks(
  586.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  587. {
  588.     /*
  589.      * Release des locks de lecture:
  590.      */
  591.     while( pVoie_curr -> pCRLstElt_1stRLock != NULL )
  592.     {
  593.         DBInt_releaseReadLock( pVoie_curr, pVoie_curr -> pCRLstElt_1stRLock -> pCompRec );
  594.     }
  595.  
  596.     /*
  597.      * release du XLock:
  598.      */
  599.     if( pVoie_curr -> pCompRec_XLock != NULL )
  600.     {
  601.         DBInt_releaseXLock( pVoie_curr, pVoie_curr -> pCompRec_XLock );
  602.     } 
  603. }
  604.